#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=10000001;
struct dummy{
    int z_f;
    int z_s;
    int fenzi;
    int fenmu;
};
struct lit{
    int to,next;
};
lit g[100001];
int pre[100001][2];
int k=0;
dummy cd;
void add(int u,int v){
    g[++k].to=v;
    g[k].next=pre[u][1];
    pre[u][1]=k;
    pre[u][0]++;
    return;
}
int sub(int a,int b){
    return a<b;
}
queue<pair<int,int> >lists;
int light[100001];
int maxli[100001];
int list2[200001];
int bond(int i,int j,int num,int deep){
    int mid=(i+j)>>1;
    if(i==mid||i+1==j){
        return i;
    }
    if(light[mid]==num){
        return mid;
    }
    if(light[mid]<num){
        return bond(mid+1,j,num,deep+1);
    }
    if(light[mid]>num){
        return bond(i,mid,num,deep+1);
    }
    return 0;
}
void chu(int zi,int mu){
    cd.z_f=zi/mu;
    cd.fenzi=zi%mu;
    cd.fenmu=mu;
    if(cd.fenzi!=0) cd.z_s=cd.z_f+1;
    else {
            cd.z_s=cd.z_f;
    }
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int t;cin>>t;
    while(t--){
        int n,m,l,v;
        cin>>n>>m>>l>>v;
        memset(maxli,0x3f,sizeof(maxli));
        memset(light,0,sizeof(maxli));
        memset(list2,0,sizeof(list2));
        int time1=0;
        for(int i=1;i<=n;i++){
            double d,vi,a;
            cin>>d>>vi>>a;
            if(vi>v){
                if(a>=0){
                    lists.push(make_pair(d,l));
                    time1++;
                }
                else{
                    chu(v*v-vi*vi,a*2);
                    if(cd.z_f==cd.z_s) lists.push(make_pair(d,d+cd.z_f-1));
                    else lists.push(make_pair(d,d+cd.z_f));
                    time1++;

                }
            }
            if(vi<v){
                if(a>0){
                    chu(v*v-vi*vi,a*2);
                    time1++;
                    if(cd.z_f==cd.z_s) lists.push(make_pair(d+cd.z_s+1,l));
                    else lists.push(make_pair(d+cd.z_s,l));
                }
            }
        }
        for(int i=1;i<=m;i++){
            cin>>light[i];
        }
        sort(light+1,light+n+1,sub);
        int listi=0;
        while(!lists.empty()){
            int dic=lists.front().second;
            int fic=lists.front().first;
            lists.pop();

       //    cout<<fic<<' '<<dic<<endl;
            if(dic==l){
                int x=bond(1,m,fic,0);
                int flag=0;
                listi++;
                for(int i=x;i<=m;i++){
                    if(fic<=light[i]&&dic>=light[i]){
                        flag=1;
                        add(light[i],listi);
                        list2[listi]=1;
                    }
                }
                if(!flag) listi--;

            }
            else{

                int x=bond(1,m,fic,0);
                int y=bond(1,m,dic,0);
                int flag=0;
                listi++;
                for(int i=x;i<=y;i++){
                    if(fic<=light[i]&&dic>=light[i]){
       //                 cout<<fic<<"  "<<light[i];
                        flag=1;
                        add(light[i],listi);
                        list2[listi]=1;
                    }

                }
                if(!flag)listi--;
            }
        }
        cout<<listi<<endl;

        memset(list2,0,sizeof(list2));
      /*
        for(int i=1;i<=m;i++){
            int k=pre[i];
            while(g[k].to){
                list2[g[k].to]
            }
            maxli[i]=min
        }
        */
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
